# -*- coding: utf-8 -*-
"""
Created on Mon Jul 30 15:19:50 2018

@author: Zhang Yafei
"""
"""
列表生成式，能简化很多代码 
第一项写需要输出的东西（i*i）,中间写for循环，后面写条件
"""
print('列表生成式')
li = [i * i for i in range(1, 10) if i % 2 == 0]
print(li)
"""
列表生成器，他跟列表生成式的区别相当range和xrange的区别，数据大的时候节省内存空间 
最简单的办法就把原来的[]换成()就可以了,不过输出变成了迭代对象
"""
print('列表生成器')
li1 = (i * i for i in range(1, 10) if i % 2 == 0)
list(li1)
li1.__next__()
for i in li1:
    print(i)
"""
函数中的列表生成器 
函数中包含yield语句的函数会被特地的编译成生成器，当函数被调用时，他们返回一个生成器对象 
每当遇到yield的时候，可以当成return
"""
print('yield 生成器')


def f(n):
    sum = 0
    i = 0
    while (i < n):
        sum += i
        i += 1
        yield (sum)


print(type(f(5)))
for i in f(5):
    print(i)
"""
列表生成式：一次性生成所有的数据，然后保存在内存中，适合小量数据 
列表生成器：返回一个迭代器，即‘generator’对象，必须通过循环才能一一取出数据 
可迭代对象：可以通过循环调用出来的，就是可迭代对象 
迭代器：简单理解为生成器，必须通过next()调用的，被next()函数调用并不断返回下一个值的对象称为迭代器
"""
print('打印9*9乘法表')
# i取值范围为1, 2, 3, 4, 5, 6, 7, 8, 9
for i in range(1, 10):
    # 每个内层for循环结束后换行，即在输出完九九乘法表一行后换行
    # j取值范围为1, 2, ..., i
    for j in range(1, i + 1):
        # 逗号用来取消自动换行
        print('%d*%d = %d\t' % (i, j, i * j))
